package com.gpj.netty.application.netty.base;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @className ServerHandler
 * @description 服务端SocketChannel处理器
 * @author GPJ
 * @date 2021/12/7 10:47
 * @version 1.0
 **/
@Slf4j
public class ServerHandler extends ChannelInboundHandlerAdapter {
	/**
	 * 接收到客户端连接的回调方法
	 * @param ctx
	 * @throws Exception
	 */
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		log.debug("[{}]客户端连接成功", ctx.channel().remoteAddress());
	}

	/**
	 * 读取客户端请求数据的回调方法
	 * @param ctx
	 * @param msg
	 * @throws Exception
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		log.debug("开始接受客户端请求...");
		log.info("接收到客户端请求:{}", ((ByteBuf) msg).toString(CharsetUtil.UTF_8));
		log.debug("客户端请求接收完毕");
	}

	/**
	 * 读取请求完毕的回调方法(通常是进行响应)
	 * @param ctx
	 * @throws Exception
	 */
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		log.debug("开始响应客户端请求...");
		ByteBuf buf = Unpooled.copiedBuffer(("hello client ["
				+ ctx.channel().remoteAddress().toString() + "]").getBytes(CharsetUtil.UTF_8));
		ctx.writeAndFlush(buf);
		log.debug("客户端请求响应完毕");
	}

	/**
	 * 异常处理的回调方法(通常是关闭连接)
	 * @param ctx
	 * @param cause
	 * @throws Exception
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		log.error("服务器异常:{}", cause.getLocalizedMessage());
		ctx.close();
	}
}
